/**
 * 格式化日期为 YYYY-MM-DD 格式
 * @param {Date|string} date 日期对象或日期字符串
 * @returns {string} 格式化后的日期字符串
 */
const formatDate = date => {
  date = typeof date === 'string' ? new Date(date) : date
  
  const year = date.getFullYear()
  const month = (date.getMonth() + 1).toString().padStart(2, '0')
  const day = date.getDate().toString().padStart(2, '0')
  
  return `${year}-${month}-${day}`
}

/**
 * 格式化日期为易读格式 (MM月DD日 周X)
 * @param {Date|string} date 日期对象或日期字符串
 * @returns {string} 格式化后的日期字符串
 */
const formatReadableDate = date => {
  date = typeof date === 'string' ? new Date(date) : date
  
  const month = date.getMonth() + 1
  const day = date.getDate()
  const weekdayMap = ['日', '一', '二', '三', '四', '五', '六']
  const weekday = weekdayMap[date.getDay()]
  
  return `${month}月${day}日 周${weekday}`
}

/**
 * 检查日期是否为今天
 * @param {Date|string} date 日期对象或日期字符串
 * @returns {boolean} 是否为今天
 */
const isToday = date => {
  date = typeof date === 'string' ? new Date(date) : date
  const today = new Date()
  
  return date.getFullYear() === today.getFullYear() &&
         date.getMonth() === today.getMonth() &&
         date.getDate() === today.getDate()
}

/**
 * 验证手机号是否有效
 * @param {string} phone 手机号
 * @returns {boolean} 是否有效
 */
const validatePhone = phone => {
  const phoneReg = /^1[3-9]\d{9}$/
  return phoneReg.test(phone)
}

/**
 * 验证车牌号是否有效
 * @param {string} license 车牌号
 * @returns {boolean} 是否有效
 */
const validateLicense = license => {
  return license && license.length >= 5
}

/**
 * 计算周几扣除的预约额度
 * @param {Date|string|number} date 日期对象、日期字符串或星期几(0-6, 0表示周一)
 * @returns {number} 扣除的额度
 */
const calculateDayQuota = date => {
  let weekday
  
  if (typeof date === 'number' && date >= 0 && date <= 6) {
    weekday = date
  } else {
    date = typeof date === 'string' ? new Date(date) : date
    // 调整为周一为第一天: 0=周一, 1=周二, ..., 6=周日
    weekday = date.getDay() - 1
    if (weekday === -1) weekday = 6
  }
  
  // 周一(0)或周五(4)扣0.5次，周二至周四(1-3)扣1次
  if (weekday === 0 || weekday === 4) {
    return 0.5
  } else if (weekday >= 1 && weekday <= 3) {
    return 1
  } else {
    // 周末不扣除
    return 0
  }
}

/**
 * 显示提示框
 * @param {string} title 提示内容
 * @param {string} icon 图标类型，默认为none
 * @param {number} duration 持续时间，默认为2000毫秒
 */
const showToast = (title, icon = 'none', duration = 2000) => {
  wx.showToast({
    title,
    icon,
    duration
  })
}

/**
 * 获取本月最后一个星期四的日期
 * @param {number} year 年份
 * @param {number} month 月份(1-12)
 * @returns {Date} 本月最后一个星期四的日期
 */
const getLastThursdayOfMonth = (year, month) => {
  // 月份在JS中是0-11，所以需要调整
  const jsMonth = month - 1;
  
  // 获取下个月的第一天
  const firstDayOfNextMonth = new Date(year, jsMonth + 1, 1);
  
  // 计算当月的最后一天
  const lastDay = new Date(firstDayOfNextMonth);
  lastDay.setDate(lastDay.getDate() - 1);
  
  // 从当月最后一天开始向前查找第一个星期四(4)
  const date = new Date(lastDay);
  
  // 继续向前查找，直到找到星期四
  while (date.getDay() !== 4) {
    date.setDate(date.getDate() - 1);
  }
  
  return date;
}

/**
 * 格式化日期时间为易读格式
 * @param {Date|string} date 日期时间对象或字符串
 * @returns {string} 格式化后的日期时间字符串
 */
const formatTime = date => {
  date = typeof date === 'string' ? new Date(date) : date
  
  const year = date.getFullYear()
  const month = (date.getMonth() + 1).toString().padStart(2, '0')
  const day = date.getDate().toString().padStart(2, '0')
  const hour = date.getHours().toString().padStart(2, '0')
  const minute = date.getMinutes().toString().padStart(2, '0')
  
  return `${month}月${day}日 ${hour}:${minute}`
}

module.exports = {
  formatDate,
  formatReadableDate,
  isToday,
  validatePhone,
  validateLicense,
  calculateDayQuota,
  showToast,
  getLastThursdayOfMonth,
  formatTime
}
